// app/service/validation_service.js
'use strict';

const Service = require('egg').Service;
const Joi = require('joi');

class ValidationService extends Service {
  /**
   * 验证用户创建参数
   */
  validateCreateUser(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).required(),
      email: Joi.string().email().required(),
      password: Joi.string().min(6).max(20).required(),
      role: Joi.string().valid('admin', 'user', 'auditor').required(),
      status: Joi.string().valid('active', 'inactive', 'locked').optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证用户更新参数
   */
  validateUpdateUser(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).optional(),
      email: Joi.string().email().optional(),
      password: Joi.string().min(6).max(20).optional(),
      role: Joi.string().valid('admin', 'user', 'auditor').optional(),
      status: Joi.string().valid('active', 'inactive', 'locked').optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证角色创建参数
   */
  validateCreateRole(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).required(),
      description: Joi.string().max(200).optional(),
      permissions: Joi.object({
        menu: Joi.array().items(Joi.string()).optional(),
        action: Joi.array().items(Joi.string()).optional(),
        data: Joi.object({
          scope: Joi.string().optional(),
          departments: Joi.array().optional()
        }).optional()
      }).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证角色更新参数
   */
  validateUpdateRole(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).optional(),
      description: Joi.string().max(200).optional(),
      permissions: Joi.object({
        menu: Joi.array().items(Joi.string()).optional(),
        action: Joi.array().items(Joi.string()).optional(),
        data: Joi.object({
          scope: Joi.string().optional(),
          departments: Joi.array().optional()
        }).optional()
      }).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证ID参数
   */
  validateId(id) {
    const schema = Joi.number().integer().positive().required();
    return schema.validate(id);
  }
  
  /**
   * 验证供应商创建参数
   */
  validateCreateSupplier(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).required(),
      contactPerson: Joi.string().max(50).optional().allow(''),
      phone: Joi.string().max(50).optional().allow(''),
      email: Joi.string().email().optional().allow(''),
      address: Joi.string().max(200).optional().allow(''),
      remark: Joi.string().max(500).optional().allow(''),
      status: Joi.string().valid('pending', 'active', 'suspended', 'terminated').optional(),
      rating: Joi.number().min(0).max(5).optional(),
      cooperationDate: Joi.date().iso().optional().allow(null).allow('')
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证供应商更新参数
   */
  validateUpdateSupplier(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).optional(),
      contactPerson: Joi.string().max(50).optional().allow(''),
      phone: Joi.string().max(50).optional().allow(''),
      email: Joi.string().email().optional().allow(''),
      address: Joi.string().max(200).optional().allow(''),
      remark: Joi.string().max(500).optional().allow(''),
      status: Joi.string().valid('pending', 'active', 'suspended', 'terminated').optional(),
      rating: Joi.number().min(0).max(5).optional(),
      cooperationDate: Joi.date().iso().optional().allow(null).allow('')
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证客户创建参数
   */
  validateCreateCustomer(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).required(),
      code: Joi.string().max(50).optional(),
      customerType: Joi.string().max(50).optional(),
      customerLevel: Joi.string().max(50).optional(),
      customerSource: Joi.string().max(50).optional(),
      contactPerson: Joi.string().max(50).optional(),
      phone: Joi.string().max(20).optional(),
      email: Joi.string().email().optional().allow(''),
      address: Joi.string().max(200).optional(),
      responsibleSalesman: Joi.string().max(50).optional(),
      creditRating: Joi.string().max(10).optional(),
      creditScore: Joi.number().min(0).max(100).optional(),
      customerValue: Joi.number().min(0).max(5).optional(),
      remark: Joi.string().max(500).optional(),
      status: Joi.number().integer().valid(0, 1).optional(),
      rating: Joi.number().min(0).max(5).optional(),
      contactPersons: Joi.string().optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证客户更新参数
   */
  validateUpdateCustomer(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).optional(),
      code: Joi.string().max(50).optional(),
      customerType: Joi.string().max(50).optional(),
      customerLevel: Joi.string().max(50).optional(),
      customerSource: Joi.string().max(50).optional(),
      contactPerson: Joi.string().max(50).optional(),
      phone: Joi.string().max(20).optional(),
      email: Joi.string().email().optional().allow(''),
      address: Joi.string().max(200).optional(),
      responsibleSalesman: Joi.string().max(50).optional(),
      creditRating: Joi.string().max(10).optional(),
      creditScore: Joi.number().min(0).max(100).optional(),
      customerValue: Joi.number().min(0).max(5).optional(),
      remark: Joi.string().max(500).optional(),
      status: Joi.number().integer().valid(0, 1).optional(),
      rating: Joi.number().min(0).max(5).optional(),
      contactPersons: Joi.string().optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证产品分类创建参数
   */
  validateCreateProductCategory(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).required(),
      parentId: Joi.number().integer().positive().optional(),
      description: Joi.string().max(200).optional(),
      level: Joi.number().integer().min(1).max(4).optional(),
      sortOrder: Joi.number().integer().optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证产品分类更新参数
   */
  validateUpdateProductCategory(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).optional(),
      parentId: Joi.number().integer().positive().optional(),
      description: Joi.string().max(200).optional(),
      level: Joi.number().integer().min(1).max(4).optional(),
      sortOrder: Joi.number().integer().optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证销售订单创建参数
   */
  validateCreateSalesOrder(data) {
    const schema = Joi.object({
      orderNumber: Joi.string().max(50).required(),
      customerId: Joi.number().integer().positive().required(),
      orderDate: Joi.date().iso().required(),
      amount: Joi.number().positive().required(),
      status: Joi.string().valid('pending', 'confirmed', 'shipped', 'delivered', 'cancelled').required(),
      paymentStatus: Joi.string().valid('unpaid', 'partial', 'paid').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证销售订单更新参数
   */
  validateUpdateSalesOrder(data) {
    const schema = Joi.object({
      orderNumber: Joi.string().max(50).optional(),
      customerId: Joi.number().integer().positive().optional(),
      orderDate: Joi.date().iso().optional(),
      amount: Joi.number().positive().optional(),
      status: Joi.string().valid('pending', 'confirmed', 'shipped', 'delivered', 'cancelled').optional(),
      paymentStatus: Joi.string().valid('unpaid', 'partial', 'paid').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证银行流水创建参数
   */
  validateCreateBankTransaction(data) {
    const schema = Joi.object({
      transactionDate: Joi.date().iso().required(),
      amount: Joi.number().required(),
      type: Joi.string().valid('income', 'expense').required(),
      counterparty: Joi.string().max(100).required(),
      description: Joi.string().max(200).optional(),
      status: Joi.string().valid('pending', 'confirmed', 'rejected').required(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证银行流水更新参数
   */
  validateUpdateBankTransaction(data) {
    const schema = Joi.object({
      transactionDate: Joi.date().iso().optional(),
      amount: Joi.number().optional(),
      type: Joi.string().valid('income', 'expense').optional(),
      counterparty: Joi.string().max(100).optional(),
      description: Joi.string().max(200).optional(),
      status: Joi.string().valid('pending', 'confirmed', 'rejected').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证催款创建参数
   */
  validateCreateCollection(data) {
    const schema = Joi.object({
      customerId: Joi.number().integer().positive().required(),
      amount: Joi.number().positive().required(),
      dueDate: Joi.date().iso().required(),
      status: Joi.string().valid('pending', 'partial', 'completed', 'overdue').required(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证催款更新参数
   */
  validateUpdateCollection(data) {
    const schema = Joi.object({
      customerId: Joi.number().integer().positive().optional(),
      amount: Joi.number().positive().optional(),
      dueDate: Joi.date().iso().optional(),
      status: Joi.string().valid('pending', 'partial', 'completed', 'overdue').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证催款记录创建参数
   */
  validateCreateCollectionRecord(data) {
    const schema = Joi.object({
      collectionId: Joi.number().integer().positive().required(),
      amount: Joi.number().positive().required(),
      collectionDate: Joi.date().iso().required(),
      method: Joi.string().valid('phone', 'email', 'visit', 'letter').required(),
      result: Joi.string().valid('promised', 'partial', 'refused', 'completed').required(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证催款记录更新参数
   */
  validateUpdateCollectionRecord(data) {
    const schema = Joi.object({
      collectionId: Joi.number().integer().positive().optional(),
      amount: Joi.number().positive().optional(),
      collectionDate: Joi.date().iso().optional(),
      method: Joi.string().valid('phone', 'email', 'visit', 'letter').optional(),
      result: Joi.string().valid('promised', 'partial', 'refused', 'completed').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证库存创建参数
   */
  validateCreateInventory(data) {
    const schema = Joi.object({
      productId: Joi.number().integer().positive().required(),
      quantity: Joi.number().integer().required(),
      unit: Joi.string().max(20).required(),
      location: Joi.string().max(100).optional(),
      minStock: Joi.number().integer().optional(),
      maxStock: Joi.number().integer().optional(),
      status: Joi.string().valid('normal', 'low', 'out').required()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证库存更新参数
   */
  validateUpdateInventory(data) {
    const schema = Joi.object({
      productId: Joi.number().integer().positive().optional(),
      quantity: Joi.number().integer().optional(),
      unit: Joi.string().max(20).optional(),
      location: Joi.string().max(100).optional(),
      minStock: Joi.number().integer().optional(),
      maxStock: Joi.number().integer().optional(),
      status: Joi.string().valid('normal', 'low', 'out').optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证品牌创建参数
   */
  validateCreateBrand(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).required(),
      description: Joi.string().max(200).optional(),
      logo: Joi.string().max(200).optional(),
      status: Joi.string().valid('active', 'inactive').required()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证品牌更新参数
   */
  validateUpdateBrand(data) {
    const schema = Joi.object({
      name: Joi.string().max(50).optional(),
      description: Joi.string().max(200).optional(),
      logo: Joi.string().max(200).optional(),
      status: Joi.string().valid('active', 'inactive').optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证合同创建参数
   */
  validateCreateContract(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().required(),
      contractNumber: Joi.string().max(50).required(),
      name: Joi.string().max(100).required(),
      startDate: Joi.date().iso().required(),
      endDate: Joi.date().iso().required(),
      amount: Joi.number().positive().required(),
      status: Joi.string().valid('active', 'expired', 'terminated').required(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证合同更新参数
   */
  validateUpdateContract(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().optional(),
      contractNumber: Joi.string().max(50).optional(),
      name: Joi.string().max(100).optional(),
      startDate: Joi.date().iso().optional(),
      endDate: Joi.date().iso().optional(),
      amount: Joi.number().positive().optional(),
      status: Joi.string().valid('active', 'expired', 'terminated').optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证入库单创建参数
   */
  validateCreateInboundOrder(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().required(),
      inboundNumber: Joi.string().max(50).required(),
      inboundDate: Joi.date().iso().required(),
      totalAmount: Joi.number().positive().required(),
      hasInvoice: Joi.boolean().optional(),
      invoiceStatus: Joi.string().valid('pending', 'received', 'uploaded').optional(),
      freight: Joi.number().optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证入库单更新参数
   */
  validateUpdateInboundOrder(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().optional(),
      inboundNumber: Joi.string().max(50).optional(),
      inboundDate: Joi.date().iso().optional(),
      totalAmount: Joi.number().positive().optional(),
      hasInvoice: Joi.boolean().optional(),
      invoiceStatus: Joi.string().valid('pending', 'received', 'uploaded').optional(),
      freight: Joi.number().optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证供应商评估创建参数
   */
  validateCreateSupplierEvaluation(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().required(),
      evaluationDate: Joi.date().iso().required(),
      score: Joi.number().min(0).max(100).required(),
      reviewer: Joi.string().max(50).required(),
      comment: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证供应商评估更新参数
   */
  validateUpdateSupplierEvaluation(data) {
    const schema = Joi.object({
      supplierId: Joi.number().integer().positive().optional(),
      evaluationDate: Joi.date().iso().optional(),
      score: Joi.number().min(0).max(100).optional(),
      reviewer: Joi.string().max(50).optional(),
      comment: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证对账结果创建参数
   */
  validateCreateReconciliationResult(data) {
    const schema = Joi.object({
      orderId: Joi.number().integer().positive().required(),
      transactionId: Joi.number().integer().positive().required(),
      matchStatus: Joi.string().valid('matched', 'unmatched', 'partial').required(),
      confidence: Joi.number().min(0).max(100).required(),
      algorithm: Joi.string().max(50).required(),
      operator: Joi.string().max(50).required(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证对账结果更新参数
   */
  validateUpdateReconciliationResult(data) {
    const schema = Joi.object({
      orderId: Joi.number().integer().positive().optional(),
      transactionId: Joi.number().integer().positive().optional(),
      matchStatus: Joi.string().valid('matched', 'unmatched', 'partial').optional(),
      confidence: Joi.number().min(0).max(100).optional(),
      algorithm: Joi.string().max(50).optional(),
      operator: Joi.string().max(50).optional(),
      remark: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证用户分组创建参数
   */
  validateCreateUserGroup(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).required(),
      description: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
  
  /**
   * 验证用户分组更新参数
   */
  validateUpdateUserGroup(data) {
    const schema = Joi.object({
      name: Joi.string().max(100).optional(),
      description: Joi.string().max(500).optional()
    });
    
    return schema.validate(data);
  }
}

module.exports = ValidationService;